查看原文
其他

终于弄明白 i = i++和 i = ++i 了

点击关注 👉 Java核心技术 2023-02-27

戳这里,加关注哦~


写在前面:前些天看完了JVM的内存结构,自以为自己是懂了,心里想想不就是分线程共享和线程私有嘛,然后又怎么怎么分怎么怎么的嘛…


直到遇到了这道题目。说句实话,曾经自己做这种运算题目,完全是靠脑子空想,然后拿上笔颤抖的写下一个自己都不知道正不正确的答案。不过过了今天,我终于能确定它的答案了。


为此,我也专门写一篇博客,记录我的学习!!!


1、题目

package pers.mobian.questions01;

public class test01 {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i="+i);
        System.out.println("j="+j);
        System.out.println("k="+k);
    }
}


你能肯定并且准确的说出你的答案吗?


2、分析

在做这道题时我们的脑中要有对应的JVM内存结构。其中一个方法对应一个栈帧

此题目我们只需要用到栈帧里面的局部变量表和操作数栈


2.1、第一步

int i = 1

只是一个简单的赋值操作


2.2、第二步

i = i++

结果:i还是等于1


2.3、第三步

int j = i++

结果:i在局部变量表中变成了2,操作数栈中的 i 值为1,并且将 i 的值返回给 j,即此条语句以后,i = 2,j = 1


2.4、第四步

int k = i + ++i * i++

结果:局部变量表中的i = 4,k = 11


2.5、结果

3、i = ++i

按理说根据上面的分析过程,再来分析 i = ++i,就很简单了。
我们的 i 变量先在局部变量表中进行自增,然后再将 i 进栈,然后再把栈中的数据返回给我们的变量 i 。

public class test02 {
    public static void main(String[] args) {
        int i = 1;
        i = ++i;
        System.out.println(i); // 结果:i = 2
    }
}


最后的最后:本文的思考过程和计算推导仅针对Java语言

来源:https://urlify.cn/Abyuyy


最后给大家送下福利,大家可以关注Java核心技术公众号,在后台回复 “福利”可以获取一份我整理的最新Java面试题资料。

最近好文分享
1、IDEA 中这么玩 MyBatis,让编码速度飞起!
2、用 Java 写了一个类 QQ 界面聊天小项目
3、一文搞懂Spring AOP原理,面试不再怕的!
4、基于SpringBoot + MyBatis + Vue的代码生成器
5、来试试这款轻量级HTTP客户端神器?
6、5 款超强大的JVM 性能调优监控工具
……

更多请扫码关注 • Java核心技术一个分享Java核心技术干货的公众号
点击阅读原文获取面试题~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存